func.defaults — значения по умолчанию в Python
Источник: https://t.me/Python_libr/3554
Краткое содержание
Короткая обучающая заметка о поведении атрибута func.__defaults__ в Python. Значения аргументов по умолчанию вычисляются один раз при определении функции и сохраняются в кортеже func.__defaults__. Это вызывает неожиданное поведение при использовании изменяемых объектов (например, списков или словарей) в качестве значений по умолчанию — все вызовы функции разделяют один и тот же объект.
def foo(x, lst=[]):
lst.append(x)
return lst
print(foo(1)) # [1]
print(foo(2)) # [1, 2] — список не сбрасывается!
print(foo.__defaults__) # ([1, 2],)
Однако это же свойство можно использовать намеренно — например, для передачи значений в лямбда-функции через раннее связывание:
funcs = [lambda x, n=n: x + n for n in range(5)]
print(funcs[3](10)) # 13 — n зафиксировано через __defaults__
Значимость
Важная тонкость Python для понимания области видимости и жизненного цикла объектов. Тема актуальна при написании функций с изменяемыми аргументами по умолчанию и при создании замыканий в циклах.
🧾 Транскрипт (формат)
📌 func.__defaults__
Источник: https://t.me/Python_libr/3554
📌 func.__defaults__
Значения по умолчанию генерируются только один раз и сохраняются в переменной func.__defaults__, что и приводит к странному поведению.
Но это может сыграть и нам на руку, ведь таким образом можно передать значения в лямбду.
#урок